#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <functional>

using namespace std;

// typedef function<void()> func;
// vector<func> callbacks;

// uint64_t count = 0;

// void showCount()
// {
//     // cout << "进程捕捉到了一个信号，正在处理中： " << signum << " Pid: " << getpid() << endl;
//     cout << "final count : " << count << endl;
// }

// void showLog()
// {
//     cout << "这个是日志功能" << endl;
// }

// void logUser()
// {
//     if (fork() == 0)
//     {
//         execl("/usr/bin/who", "who", nullptr);
//         exit(1);
//     }
//     wait(nullptr);
// }


// static void usehelp(string proc)
// {
//     cout << "use : " << proc << " signnumber processid" << endl;
// }

// //定时器功能
// void catchSig(int signum)
// {
//     for (auto& f : callbacks)
//     {
//         f();
//     }
//     alarm(1);
// }

void handler(int signum)
{
    sleep(1);
    cout << "获得了一个信号: " << signum << endl;
    // exit(1);
}

int main(int argc, char* argv[])
{

    signal(SIGFPE, handler);
    int a = 100;
    a /= 0;
    
    // signal(SIGSEGV, handler);

    // int *p = nullptr;
    // *p = 100;

    while(true) sleep(1);
    

    // //1.验证1s内，一共会进行多少次count++
    // //只有5w左右的原因是，cout + 网络发送 = io
    // alarm(1);//设定了一个闹钟，一旦这个闹钟触发，就自动移除了
    // //2.单纯计算算力
    // signal(SIGALRM, catchSig);

    // callbacks.push_back(showCount);
    // callbacks.push_back(showLog);
    // callbacks.push_back(logUser);
    // while (true)
    // {
    //     count++;
    // }



    // cout << "我开始运行了" << endl;
    // abort();//raise(6) kill(getpid(), 6) 通常用来终止进程
    // //raise(8);


    // if (argc != 3)
    // {
    //     usehelp(argv[0]);
    //     exit(0);
    // }

    // int signnumber = atoi(argv[1]);
    // int processid = atoi(argv[2]);

    // kill(processid, signnumber);

    //signal(2, func);
    // signal(SIGINT, catchSig);//特定信号的处理动作，一般只有一个
    // //ctrl+\;
    // signal(SIGQUIT, catchSig);
    //signal函数，仅仅是修改进程对特定信号的后续处理动作，不是直接调用对应的处理动作
    //如果后续没有任何SIGINT信号产生，catchSig永远也不会被调用

    // while (true)
    // {
    //     cout << "我是一个进程，我正在运行...， Pid : " << getpid() << endl;
    //     sleep(1);
    // }

    // pid_t id = fork();
    // if (id == 0)
    // {
    //     sleep(1);
    //     int a = 100;
    //     a /= 0;
    //     exit(0);
    // }

    // int status = 0;
    // waitpid(id, &status, 0);
    // std::cout << "父进程: " << getpid() << "子进程: " << id << " exit sig: " << (status & 0x7F) << " is core " << ((status >> 7) & 1) << endl;

    return 0;

}